/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package src.j2ee.compumake.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import src.j2ee.compumake.dominio.Producto;
import src.j2ee.compumake.dominio.Sucursal;
import src.j2ee.compumake.dominio.Transferencia;

/************************************************************************
 **                                                                    **
 ** Nombre: DAOTransferencia.java                                      **
 ** Version: v1.0.0                                                    **
 ** Autor: amado.cante                                                 **
 ** Creado: 30/05/2013                                                 **
 ** Modificado:                                                        **
 ** Diagrama:                                                          **
 ** Caso de uso:                                                       **
 **                                                                    **
 ***********************************************************************/
public class DAOTransferencia {
    private static final String TABLA_TRANSFERENCIAS = "Transferencias";
    private static final String ID_TRANSFERENCIAS = "idTransferencias";
    private static final String ID_PRODUCTO="idProducto";
    private static final String SUCURSAL_ORIGEN = "sucursalOrigen";
    private static final String SUCURSAL_DESTINO = "sucursalDestino";
    private static final String FECHA_SOLICITUD = "fechaSolicitud";
    private static final String FECHA_ENVIADO = "fechaEnviado";
    private static final String FECHA_RECIBIDO = "fechaRecibido";
    
    private Connection conexion;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();

    public DAOTransferencia() {
        this.conexion = conexion=this.acceso.abrirConexion();
    }
    
    public boolean insertarTransferencia(Transferencia transferencia){
        try{
            DAOProducto daoProducto = new DAOProducto();
            int idProducto = daoProducto.buscaClaveProducto(transferencia.getProducto());
            String query = "INSERT INTO "+TABLA_TRANSFERENCIAS+" ("+ID_PRODUCTO
                    +","+SUCURSAL_ORIGEN+","+SUCURSAL_DESTINO+","+FECHA_SOLICITUD
                    +") VALUES('"+idProducto+"','"+transferencia.getSucursalOrigen().getClaveSucursal()
                    +"','"+transferencia.getSucursalDestino().getClaveSucursal()
                    +"','"+transferencia.getFechaSolicitud()+"')";
            Statement sentencia = this.acceso.crearSentenciaBD(conexion);
            int afectados = sentencia.executeUpdate(query);
            boolean realizado=false;
            if(afectados>0){
                realizado=true;
            }
            return (realizado);
        }catch(SQLException ex){
            return false;
        }
    }
    
    public boolean registrarEnvioTransferencia(int idTransferencia, String fechaEnvio){
        try{
            Transferencia transferencia = this.obtenerTransferencia(idTransferencia);
            if(transferencia!=null){
                String query="UPDATE "+TABLA_TRANSFERENCIAS+" SET "+FECHA_ENVIADO+"='"
                        +fechaEnvio+"' WHERE "+ID_TRANSFERENCIAS+"='"+idTransferencia+"';";
                Statement sentencia = acceso.crearSentenciaBD(conexion);
                int afectados = sentencia.executeUpdate(query);
                boolean realizado=false;
                if(afectados>0){
                    DAOProducto daoProducto = new DAOProducto();
                    int idProducto = daoProducto.buscaClaveProducto(transferencia.getProducto());
                    int existencia= daoProducto.obtenerExistenciaProductoSucursal(idProducto,transferencia.getSucursalOrigen().getClaveSucursal());
                    String queryExistencias = "UPDATE Existencias SET existencia='"
                            +(existencia-1)+"' WHERE idProducto='"+idProducto
                            +"' AND idSucursal='"+transferencia.getSucursalOrigen().getClaveSucursal()+"';";
                    Statement sentenciaExistencias = acceso.crearSentenciaBD(conexion);
                    int actualizados = sentenciaExistencias.executeUpdate(queryExistencias);
                    if(actualizados>0){
                        realizado=true;
                    }
                    return (realizado);
                }else{
                    return false;
                }    
            }else{
                return false;
            }
        }catch(SQLException ex){
            return false;
        }
    }
    public boolean registrarReciboTransferencia(int idTransferencia, String fechaRecibido){
        try{
            Transferencia transferencia = this.obtenerTransferencia(idTransferencia);
            if(transferencia!=null){
                String query="UPDATE "+TABLA_TRANSFERENCIAS+" SET "+FECHA_RECIBIDO+"='"
                    +fechaRecibido+"' WHERE "+ID_TRANSFERENCIAS+"='"+idTransferencia+"';";
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            int afectados = sentencia.executeUpdate(query);
            boolean realizado=false;
            if(afectados>0){
                DAOProducto daoProducto = new DAOProducto();
                int idProducto = daoProducto.buscaClaveProducto(transferencia.getProducto());
                int existencia= daoProducto.obtenerExistenciaProductoSucursal(idProducto,transferencia.getSucursalDestino().getClaveSucursal());
                String queryExistencias = "UPDATE Existencias SET existencia='"
                        +(existencia+1)+"' WHERE idProducto='"+idProducto
                        +"' AND idSucursal='"+transferencia.getSucursalDestino().getClaveSucursal()+"';";
                Statement sentenciaExistencias = acceso.crearSentenciaBD(conexion);
                int actualizados = sentenciaExistencias.executeUpdate(queryExistencias);
                if(actualizados>0){
                    realizado=true;
                }
            }
            return (realizado);
            }else{
                return false;
            }          
        }catch(SQLException ex){
            return false;
        }
    }
    
    private Transferencia obtenerTransferencia(int idTransferencia){
        Transferencia transferencia;
        try{
            String query="SELECT * FROM "+TABLA_TRANSFERENCIAS+" WHERE "
                    +ID_TRANSFERENCIAS+"='"+idTransferencia+"';";
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(query);
            if(resultado.first()){
                int id=resultado.getInt(1);
                int idProducto = resultado.getInt(2);
                int idSucursalOrigen=resultado.getInt(3);
                int idSucursalDestino=resultado.getInt(4);
                String fechaSolicitud = resultado.getString(5);
                String fechaEnviado=resultado.getString(6);
                String fechaRecibido=resultado.getString(7);
                DAOSucursal daoSucursal = new DAOSucursal();
                Sucursal sucursalOrigen = daoSucursal.buscaSucursal(idSucursalOrigen);
                Sucursal sucursalDestino = daoSucursal.buscaSucursal(idSucursalDestino);
                DAOProducto daoProducto = new DAOProducto();
                Producto producto = daoProducto.buscaProductoEspecifico(idProducto);
                transferencia = new Transferencia(id, producto, fechaSolicitud, fechaEnviado, fechaRecibido, sucursalOrigen, sucursalDestino);
                return transferencia;
            }else{
                return null;
            }
        }catch(SQLException ex){
            return null;
        }
    }
    
    private ArrayList<Transferencia> listarTransferenciasSucursal(int idSucursal){
        ArrayList<Transferencia> transferencias = new ArrayList<>();
        try{
            String query="SELECT "+ID_TRANSFERENCIAS+" FROM "+TABLA_TRANSFERENCIAS
                    +" WHERE "+SUCURSAL_ORIGEN+"='"+idSucursal
                    +"'OR "+SUCURSAL_DESTINO+"='"+idSucursal+"' ORDER BY "
                    +FECHA_SOLICITUD+" ASC;";
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int idTransferencia = resultado.getInt(1);
                Transferencia transferencia = this.obtenerTransferencia(idTransferencia);
                if(transferencia!=null){
                    transferencias.add(transferencia);
                }
            }
            return transferencias;
        }catch(SQLException ex){
            return transferencias;
        }
    }
    
    public ArrayList<Transferencia> listarTransferenciasSolicitadasPorEnviar(int idSucursal){
        ArrayList<Transferencia> transferencias = this.listarTransferenciasSucursal(idSucursal);
        ArrayList<Transferencia> transferenciasPorEnviar = new ArrayList<>();
        for(int i=0;i<transferencias.size();i++){
            Transferencia transferencia = transferencias.get(i);
            int idSucursalOrigen = transferencia.getSucursalOrigen().getClaveSucursal();
            String fechaEnviado = transferencia.getFechaEnviado();
            if(idSucursalOrigen == idSucursal && fechaEnviado.equals("0000-00-00")){
                transferenciasPorEnviar.add(transferencia);
            }            
        }
        return transferenciasPorEnviar;
    }
    
    public ArrayList<Transferencia> listarTransferenciasEnviadasPorRecibir(int idSucursal){
        ArrayList<Transferencia> transferencias = this.listarTransferenciasSucursal(idSucursal);
        ArrayList<Transferencia> transferenciasPorRecibir = new ArrayList<>();
        for(int i=0;i<transferencias.size();i++){
            Transferencia transferencia = transferencias.get(i);
            int idSucursalDestino = transferencia.getSucursalDestino().getClaveSucursal();
            String fechaEnviado = transferencia.getFechaEnviado();
            String fechaRecibido = transferencia.getFechaRecibido();
            if(idSucursalDestino == idSucursal && fechaRecibido.equals("0000-00-00") && !fechaEnviado.equals("0000-00-00")){
                transferenciasPorRecibir.add(transferencia);
            }            
        }
        return transferenciasPorRecibir;
    }
}
